package com.cskaoyan.javase.oop1._11static._0introduction._2new;

/**
 * 引例：
 * 创建一个学生类，用来描述我们班全体同学，要求：
 * 		属性：姓名，性别，年龄，学号，学校信息
 * 		行为：吃饭，学习
 *
 * 我们希望这个属性不是属于某一个对象的，而是一种类的特征，是属于类的，属于全体对象所共享的。
 * 所以说一千道一万，"学校信息"这个属性不应该定义为"成员变量"，而应该考虑定义一种"全新的，属于类的"变量。
 * 实际上，属于类的变量在Java当中是存在的，即使用static关键字修饰的，Java当中的静态成员变量。
 *
 * 静态成员变量的定义语法
 * static修饰成员变量被称之静态成员变量
 * 简称静态变量（没有static修饰称之为普通成员变量或成员变量）
 *
 * 静态成员变量的定义语法：
 * 需要定义在类的成员位置
 * 语法：
 * [访问权限修饰符] static 数据类型 变量名;
 *  静态成员方法的定义语法：
 * 需要定义在类的成员位置
 *
 * 静态成员变量注意事项:
 * 1.它也是具有默认初始化的,而且默认初始化要先于其它任何赋值手段(这一点和成员变量完全一样)
 * 2.对于静态成员变量的访问,应该用"类名.静态成员变量"而不是用对象名点
 *      静态成员属于类,所以用类名点访问,禁止用对象名点访问
 * 3.静态成员变量的访问,不需要创建任何对象,不依赖于对象
 *
 *
 *  静态成员方法的定义语法：
 * 需要定义在类的成员位置
 * 语法：
 * [访问权限修饰符] static 返回值类型 方法名(形参列表){
 *   //方法体
 * }
 * 以上，我们把静态成员变量和静态成员方法，统称为类的静态成员。
 * 静态成员方法的使用特点,和静态成员变量是类似的,属于类,使用类名点.
 *
 * @since 14:42
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    static int num;
    public static void main(String[] args) {
        // Java45Student s1 = new Java45Student("张三", "王道训练营Java45th");
        // Java45Student s2 = new Java45Student("李四", "王道训练营Java45th");
        // Java45Student s3 = new Java45Student("王五", "王道训练营Java45th");
        // Java45Student s1 = new Java45Student("张三");
        // Java45Student s2 = new Java45Student("李四");
        // Static member 'com.cskaoyan.javase.oop1._11static._0introduction._2new.Java45Student.schoolName' accessed via instance reference
        // 言下之意,这种访问方式不符合规范(当然不是错的)
        // System.out.println(s1.schoolName);
        // System.out.println(s2.schoolName);

        // 正确的访问方式
        System.out.println(Java45Student.schoolName);
        Java45Student.schoolName = "C++训练营";
        System.out.println(Java45Student.schoolName);


        Java45Student.testStatic();
        Java45Student.testStatic2();

        test();
        // 以上格式写全的话
        Demo.test();
        System.out.println(num);
    }

    public static void test(){

    }
}

class Java45Student {
    String name;
    /*
        性别的定义建议使用String类型的gender
        而不要使用布尔类型的isMale/isFemale
     */
    String gender;
    int age;
    int id;
    static String schoolName;

    public Java45Student(String name) {
        this.name = name;
    }

    public void study() {
        System.out.println("学习使我快乐~");
    }

    public void eat() {
        System.out.println("吃饭我也很快乐~");
    }

    public static void testStatic() {
    }

    public static void testStatic2() {
    }
}
